home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 16
/
Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso
/
Aminet
/
misc
/
emu
/
QDOS2.lha
/
QLsource
/
ROMsrc
/
SYS
/
ARITH_asm
next >
Wrap
Text File
|
1995-10-22
|
18KB
|
888 lines
*/beginfile ARITH_asm
; --------------------------------------------------------------
; ARITH_asm - QDOS arithmetic routines
; - last modified 22/10/95
; QDOS-Amiga sources by Rainer Kowallik
; ...some changes by Mark J Swift
; --------------------------------------------------------------
;*/beginoverlay
;*/note routine moved for RI.EXEC fix
RI_EXEC_a1:
MOVE.L A6,-(A7)
SUBA.L A6,A6
BSR.S RI_EXEC
BRA.S L041A4
RI_A1_EXecb:
MOVE.L A6,-(A7)
SUBA.L A6,A6
BSR.S RI_EXECB
L041A4 BEQ.S L041A8
MOVEQ #0,D2
L041A8 MOVEA.L (A7)+,A6
RTS
RI_EXEC ; operation with code in D0
MOVEM.L D1-D3/A0/A2-A3/A5,-(A7)
SUBA.L A5,A5
BRA.S L041C0
RI_EXECB ; list of operations (A5)
MOVEM.L D1-D3/A0/A2-A3/A5,-(A7)
MOVEA.L A3,A5
L041BA:
;*/insertcode
move.l a5,d0 ;*/mend
beq.s L041F8 ;*/mend
;*/endinsertcode
;*/endoverlay
MOVEQ #0,D0
MOVE.B (A5)+,D0
BEQ.S L041F8
L041C0 CMPI.B #$30,D0
BHI.S L041CC
BSR.S L041FE
BNE.S L041F8
BRA.S L041BA
L041CC ORI.W #$FF00,D0
BCLR #0,D0
ADDA.W D0,A4
BNE.S L041DE
SUBQ.W #6,A1
BSR.S L041EA
BRA.S L041E6
L041DE EXG A4,A1
BSR.S L041EA
EXG A1,A4
ADDQ.W #6,A1
L041E6 SUBA.W D0,A4
BRA.S L041BA
L041EA MOVE.W 0(A6,A4.L),0(A6,A1.L)
MOVE.L 2(A6,A4.L),2(A6,A1.L)
RTS
L041F8 MOVEM.L (A7)+,D1-D3/A0/A2-A3/A5
RTS
L041FE MOVE.W JMP_RI_Exec-2(PC,D0.W),D0
JMP JMP_RI_Exec(PC,D0.W)
JMP_RI_Exec:
DC.W RI_NINT-JMP_RI_Exec
DC.W RI_INT-JMP_RI_Exec
DC.W RI_NLINT-JMP_RI_Exec
DC.W RI_FLOAT-JMP_RI_Exec
DC.W RI_ADD-JMP_RI_Exec
DC.W RI_SUB-JMP_RI_Exec
DC.W RI_MULT-JMP_RI_Exec
DC.W RI_DIV-JMP_RI_Exec
DC.W RI_ABS-JMP_RI_Exec
DC.W RI_NEG-JMP_RI_Exec
DC.W RI_DUP-JMP_RI_Exec
DC.W RI_COS-JMP_RI_Exec
DC.W RI_SIN-JMP_RI_Exec
DC.W RI_TAN-JMP_RI_Exec
DC.W RI_COT-JMP_RI_Exec
DC.W RI_ASIN-JMP_RI_Exec
DC.W RI_ACOS-JMP_RI_Exec
DC.W RI_ATAN-JMP_RI_Exec
DC.W RI_ACOT-JMP_RI_Exec
DC.W RI_SQRT-JMP_RI_Exec
DC.W RI_LN-JMP_RI_Exec
DC.W RI_LOG10-JMP_RI_Exec
DC.W RI_EXP-JMP_RI_Exec
DC.W RI_POWFP-JMP_RI_Exec
RI_SIN:
MOVEM.L D4-D7/A4,-(A7)
MOVEQ #0,D7
BRA.S L04248
RI_COS:
MOVEM.L D4-D7/A4,-(A7)
JSR RI_ABS(PC) ;*/undomodify BSR RI_ABS
MOVEQ #-1,D7
L04248 JSR L04684(PC) ;*/undomodify BSR L04684
BNE.S L042B0
BSR.S L042B6
LEA L045AE(PC),A4 ; (MJS)
BSR.S L042C6
BTST #0,D7
BEQ.S L042B0
JSR RI_NEG(PC) ;*/undomodify BSR RI_NEG
BRA.S L042B0
RI_TAN:
MOVEM.L D4-D7/A4,-(A7)
MOVEQ #0,D6
BRA.S L04274
RI_COT:
MOVEM.L D4-D7/A4,-(A7)
MOVEQ #-$01,D6
JSR RI_NEG(PC) ;*/undomodify BSR RI_NEG
L04274:
MOVEQ #0,D7
JSR L04674(PC) ;*/undomodify BSR L04674
BNE.S L042B0
EOR.B D6,D7
BSR.S L042B6
LEA L045D6(PC),A4
JSR L04726(PC) ;*/undomodify BSR L04726
ADDQ.W #6,A1
BSR.S L042CA
SUBQ.W #6,A1
MOVE.L -10(A6,A1.L),2(A6,A1.L)
MOVE.W -12(A6,A1.L),0(A6,A1.L)
BTST #0,D7
BEQ.S L042AA
JSR RI_SWAP(PC) ;*/undomodify BSR RI_SWAP
JSR RI_NEG(PC) ;*/modify JSR RI_NEG
;*/note absolute address!
;*/undomodify BSR RI_NEG
nop ;*/modify
;*/note JSR(PC) < JSR
L042AA JSR RI_DIV(PC) ;*/undomodify BSR RI_DIV
L042AE MOVEQ #0,D0
L042B0 MOVEM.L (A7)+,D4-D7/A4
RTS
L042B6 JSR RI_DUP(PC) ;*/undomodify BSR RI_DUP
L042BA JSR RI_DUP(PC) ;*/undomodify BSR RI_DUP
JSR RI_DUP(PC) ;*/undomodify BSR RI_DUP
JMP RI_MULT(PC) ;*/undomodify BRA RI_MULT
L042C6 JSR L0472C(PC) ;*/undomodify BSR L0472C
L042CA JSR RI_MULT(PC) ;*/undomodify BSR RI_MULT
JMP RI_ADD(PC) ;*/undomodify BRA RI_ADD
L042D2 SUBQ.W #6,A1
CLR.W 4(A6,A1.L)
MOVE.L #$08014000,0(A6,A1.L) ; Floatingpoint 1.0
JMP RI_SWAP(PC) ;*/undomodify BRA RI_SWAP
RI_ACOS:
JSR RI_NEG(PC) ;*/undomodify BSR RI_NEG
BSR.S RI_ASIN
BNE.S L0431C
BSR.S L0430C
JMP RI_ADD(PC) ;*/undomodify BRA RI_ADD
RI_ASIN:
BSR.S L042BA
BSR.S L042D2
JSR RI_SUB(PC) ;*/undomodify BSR RI_SUB
BSR RI_SQRT
BNE.S L0431C
JSR RI_DIV(PC) ;*/undomodify BSR RI_DIV
BEQ.S RI_ATAN
BSR.S L0430C
JMP RI_MULT(PC) ;*/undomodify BRA RI_MULT
L0430C SUBQ.W #6,A1
MOVE.L #$6487ED51,2(A6,A1.L) ; PI/2
MOVE.W #$0801,0(A6,A1.L)
L0431C RTS
RI_ACOT:
MOVEM.L D4-D7/A4,-(A7)
MOVEQ #$02,D7
BRA.S L0432C
RI_ATAN:
MOVEM.L D4-D7/A4,-(A7)
MOVEQ #0,D7
L0432C TST.B 2(A6,A1.L)
BGE.S L04338
ADDQ.B #4,D7
JSR RI_NEG(PC) ;*/undomodify BSR RI_NEG
L04338 CMPI.W #$0800,0(A6,A1.L)
BLE.S L0434A
BSR.S L042D2
JSR RI_DIV(PC) ;*/undomodify BSR RI_DIV
BCHG #$01,D7
L0434A JSR RI_DUP(PC) ;*/undomodify BSR RI_DUP
SUBQ.W #6,A1
MOVE.L #$4498517A,2(A6,A1.L) ;*/mend MOVE.L #$4498517A,2(A6,A1.W)
MOVE.W #$07FF,0(A6,A1.L) ; 0.2679492
JSR RI_SUB(PC) ;*/undomodify BSR RI_SUB
ADDQ.W #6,A1
TST.B -$04(A6,A1.L)
BLE.S L04378
LEA L045F2(PC),A4 ; (MJS)
JSR L04726(PC) ;*/undomodify BSR L04726
JSR RI_DIV(PC) ;*/undomodify BSR RI_DIV
ADDQ.B #1,D7
L04378 BSR L042B6
LEA L0461A(PC),A4 ; (MJS)
JSR L04726(PC) ;*/undomodify BSR L04726
JSR RI_DIV(PC) ;*/undomodify BSR RI_DIV
BSR L042CA
LSR.B #1,D7
BCC.S L043A4
SUBQ.W #6,A1
MOVE.L #$430548E1,2(A6,A1.L) ; 0.5235988
MOVE.W #$0800,0(A6,A1.L)
JSR RI_ADD(PC) ;*/undomodify BSR RI_ADD
L043A4 LSR.B #1,D7
BCC.S L043B4
JSR RI_NEG(PC) ;*/undomodify BSR RI_NEG
BSR L0430C
JSR RI_ADD(PC) ;*/undomodify BSR RI_ADD
L043B4 LSR.B #1,D7
BCC L042AE
JSR RI_NEG(PC) ;*/undomodify BSR RI_NEG
BRA L042B0
RI_POWFP:
MOVE.W 0(A6,A1.L),D1
BEQ.S L043E6
MOVE.W #$080F,D0
SUB.W D1,D0
BLT.S L043F0
CMPI.W #$000F,D0
BGT.S L043F0
MOVE.L 2(A6,A1.L),D1
TST.W D1
BNE.S L043F0
ASR.L D0,D1
TST.W D1
BNE.S L043F0
SWAP D1
L043E6 ADDQ.W #4,A1
MOVE.W D1,0(A6,A1.L)
JMP L047DC(PC) ;*/undomodify BRA L047DC
L043F0 MOVEM.L D4-D7/A4,-(A7)
MOVE.W 0(A6,A1.L),D4
MOVE.L 2(A6,A1.L),D5
ADDQ.W #6,A1
TST.B 2(A6,A1.L)
BEQ.S L04420
BSR.S RI_LN
BNE L042B0
SUBQ.W #6,A1
MOVE.L D5,2(A6,A1.L)
MOVE.W D4,0(A6,A1.L)
JSR RI_MULT(PC) ;*/undomodify BSR RI_MULT
BNE L042B0
BRA L044E4
L04420 TST.B -4(A6,A1.L)
BGE L042AE
BRA OV_ERR
RI_LOG10:
BSR.S RI_LN
BNE.S L04444
SUBQ.W #6,A1
MOVE.L #$6F2DEC55,$02(A6,A1.L) ; 1/LN(10)
MOVE.W #$07FF,0(A6,A1.L)
JSR RI_MULT(PC) ;*/undomodify BSR RI_MULT
L04444 RTS
RI_LN:
MOVEM.L D4-D7/A4,-(A7)
MOVE.W 0(A6,A1.L),D4
MOVE.L 2(A6,A1.L),D5
ADDQ.W #6,A1
BLE OV_ERR
MOVE.W #$0800,D0
MOVE.L D5,D1
LSR.L #1,D5
CMPI.L #$5A82799A,D1 ; floatingpoint 0.7071068
BGT.S L04476
SUBQ.W #1,D4
ADDI.L #$20000000,D5
BCLR #$1E,D1
BRA.S L0447E
L04476 BSET #$1E,D5
BSET #$1F,D1
L0447E:
TST.L D1
JSR L04830(PC) ;*/undomodify BSR L04830
SUBQ.W #6,A1
MOVE.L D5,2(A6,A1.L)
MOVE.W #$0800,0(A6,A1.L)
JSR RI_DIV(PC) ;*/undomodify BSR RI_DIV
BSR L042B6
JSR RI_DUP(PC) ;*/undomodify BSR RI_DUP
LEA L04636(PC),A4 ; (MJS)
MOVE.W D4,D7
JSR L04726(PC) ;*/undomodify BSR L04726
JSR RI_DIV(PC) ;*/undomodify BSR RI_DIV
JSR RI_MULT(PC) ;*/undomodify BSR RI_MULT
BSR L042CA
SUBI.W #$0800,D7
SUBQ.W #2,A1
MOVE.W D7,0(A6,A1.L)
JSR RI_FLOAT(PC) ;*/undomodify BSR RI_FLOAT
SUBQ.W #6,A1
MOVE.L #$58B90BFC,2(A6,A1.L) ; floatingpoint LN(2)
MOVE.W #$0800,0(A6,A1.L)
BSR L042CA
BRA L042AE
OV_ERR:
*/beginundoinsert
; MOVEQ #0,D0
; MOVE.L D0,2(A6,A1.L) ; set Result to Zero
; MOVE.W D0,0(A6,A1.L)
; BTST #1,$28002 ; overflow enable ?
; BNE.S L044DA
*/endundoinsert
L044D8:
MOVEQ #-18,D0 ; signal overflow
L044DA:
BRA L042B0
RI_EXP:
MOVEM.L D4-D7/A4,-(A7)
MOVEQ #0,D7
L044E4 JSR L04692(PC) ;*/undomodify BSR L04692
BNE.S L044DA
BSR L042BA
LEA L04658(PC),A4 ; (MJS)
JSR L04726(PC) ;*/undomodify BSR L04726
ADDQ.W #6,A1
JSR RI_MULT(PC) ;*/undomodify BSR RI_MULT
JSR RI_DUP(PC) ;*/undomodify BSR RI_DUP
SUBQ.W #6,A1
JSR RI_SWAP(PC) ;*/undomodify BSR RI_SWAP
JSR RI_SUB(PC) ;*/undomodify BSR RI_SUB
JSR RI_DIV(PC) ;*/undomodify BSR RI_DIV
SUBQ.W #6,A1
MOVE.L #$40000000,$02(A6,A1.L) ; floatinpoint 0.5
MOVE.W #$0800,0(A6,A1.L)
JSR RI_ADD(PC) ;*/undomodify BSR RI_ADD
ADDQ.W #1,D7
ADD.W D7,0(A6,A1.L)
BRA L042AE
RI_SQRT:
MOVEM.L D4-D7/A4,-(A7)
MOVE.W 0(A6,A1.L),D6
TST.L 2(A6,A1.L)
BEQ L042AE
BLT.S OV_ERR
LEA L04666(PC),A4 ; (MJS)
MOVE.W D6,D7
SUBI.W #$0800,D7
SUB.W D7,0(A6,A1.L)
ASR.W #1,D7
BCC.S L04554
LEA L04674(PC),A4 ; (MJS)
L04554 SWAP D6
JSR L0472C(PC) ;*/undomodify BSR L0472C
SWAP D6
ADD.W D7,0(A6,A1.L)
MOVEQ #1,D7
L04562 JSR RI_DUP(PC) ;*/undomodify BSR RI_DUP
SUBQ.W #6,A1
MOVE.L D5,2(A6,A1.L)
MOVE.W D6,0(A6,A1.L)
JSR RI_SWAP(PC) ;*/undomodify BSR RI_SWAP
JSR RI_DIV(PC) ;*/undomodify BSR RI_DIV
JSR RI_ADD(PC) ;*/undomodify BSR RI_ADD
SUBQ.W #1,0(A6,A1.L)
DBF D7,L04562
BRA L042AE
L04588 DC.W 0
DC.L 0
L0458E DC.W $07FE ; -0.1666667
DC.L $AAAAAAB0
L04594 DC.W $07FA ; 8.33333E-3
DC.L $444442DD
L0459A DC.W $07F4 ; -1.984083E-4
DC.L $97FA15C1
L045A0 DC.W $07EE ; 2.752397E-6
DC.L $5C5AE940
L045A6 DC.W $07E7 ; -2.386835E-8
DC.L $997C79C0
L045AC DC.W 5
L045AE DC.W $0801 ; 1.0
DC.L $40000000
L045B4 DC.W $07FF ; -0.4446948
DC.L $8E287BC1
L045BA DC.W $07FB ; 1.597339E-2
DC.L $416D50CD
L045C0 DC.W 2
DC.W 0
DC.W 0
DC.W 0
L045C8 DC.W $07FD ; -.1113614
DC.L $8DF7443E
L045CE DC.W $07F7 ; 1.075155E-3
DC.L $46761A70
L045D4 DC.W 2
L045D6 DC.W $0801 ; 1.732051
DC.L $6ED9EBA1
L045DC DC.W $0801 ; 1
DC.L $40000000
L045E2 DC.W 1
L045E4 DC.W $0800 ; -1
DC.L $80000000
L045EA DC.W $0801 ; 1.732051
DC.L $6ED9EBA1
L045F0 DC.W 1
L045F2 DC.W $0803 ; 4.32025
DC.L $451FBEDF
L045F8 DC.W $0803 ; 4.752226
DC.L $4C091DF8
L045FE DC.W $0801 ; 1
DC.L $40000000
L04604 DC.W 2
DC.W 0
DC.W 0
DC.W 0
L0460C DC.W $0801 ; -1.440083
DC.L $A3D5AC3B
L04612 DC.W $0800 ; -.7200268
DC.L $A3D62904
L04618 DC.W 2
L0461A DC.W $0803 ; -5.578874
DC.L $A6BCEEE1
L04620 DC.W $0801 ; 1
DC.L $40000000
L04626 DC.W 1
L04628 DC.W $07FF ; -.4649062
DC.L $88FBE7C1
L0462E DC.W $07FA ; 1.360095E-2
DC.L $6F6B44F3
L04634 DC.W 1
L04636 DC.W $0800 ; .5
DC.L $40000000
L0463C DC.W $07FC ; 5.356752E-2
DC.L $6DB4CE83
L04642 DC.W $07F5 ; 2.972936E-4
DC.L $4DEF09CA
L04648 DC.W 2
L0464A DC.W $07FF ; .25
DC.L $40000000
L04650 DC.W $07F9 ; 5.950426E-3
DC.L $617DE4BA
L04656 DC.W 1
L04658 DC.W $07FF ; .41731
DC.L $6AD4D402
L0465E DC.W $0800 ; .59016
DC.L $4B8A5CE6
L04664 DC.W 1
L04666 DC.W $0800 ; .59016
DC.L $4B8A5CE6
L0466C DC.W $0800 ; .83462
DC.L $6AD4D402
L04672 DC.W 1
L04674:
ADDQ.W #1,0(A6,A1.L)
BSR.S L04684
BNE.S L046EE
SUBQ.W #1,0(A6,A1.L)
MOVEQ #0,D0
RTS
L04684:
LEA L04714(PC),A4
CMPI.W #$0810,0(A6,A1.L)
BGT.S OV_RTS
BRA.S L0469E
L04692:
LEA L04726(PC),A4
CMPI.W #$0809,0(A6,A1.L)
BGT.S OV_RTS
L0469E:
JSR RI_DUP(PC) ;*/undomodify BSR RI_DUP
SUBQ.W #6,A1
MOVE.L -(A4),$02(A6,A1.L)
MOVE.W -(A4),0(A6,A1.L)
JSR RI_MULT(PC) ;*/undomodify BSR RI_MULT
TST.B D7
BNE.S L046C0
JSR RI_NINT(PC) ;*/undomodify BSR RI_NINT
MOVE.W D1,D7
JSR RI_FLOAT(PC) ;*/undomodify BSR RI_FLOAT
BRA.S L046D6
L046C0:
JSR RI_INT(PC) ;*/undomodify BSR RI_INT
ADD.W D1,D7
ADD.W D1,0(A6,A1.L)
ADDQ.W #1,0(A6,A1.L)
JSR RI_FLOAT(PC) ;*/undomodify BSR RI_FLOAT
SUBQ.W #1,0(A6,A1.L)
L046D6:
MOVE.W 0(A6,A1.L),D4
MOVE.L $02(A6,A1.L),D5
BSR.S L046F0
SUBQ.W #6,A1
MOVE.L D5,2(A6,A1.L)
MOVE.W D4,0(A6,A1.L)
BRA.S L046F0
OV_RTS:
*/beginundoinsert
; MOVEQ #0,D0
; MOVE.L D0,2(A6,A1.L) ; set result to 0
; MOVE.W D0,0(A6,A1.L)
; BTST #1,$28002 ; overflow enable ?
; BNE.S L046EE
*/endundoinsert
L046EC:
MOVEQ #-18,D0 ; signal overflow
L046EE:
RTS
L046F0 SUBQ.W #6,A1
MOVE.L -(A4),$02(A6,A1.L)
MOVE.W -(A4),0(A6,A1.L)
JSR RI_MULT(PC) ;*/undomodify BSR RI_MULT
JMP RI_SUB(PC) ;*/undomodify BRA RI_SUB
L04702 DC.W $07F0 ; -8.90891E-6
DC.L $B54442D1
L04708 DC.W $0802 ; 3.141602 = PI
DC.L $64880000
L0470E DC.W $07FF ; .3183099
DC.L $517CC1B7
L04714 DC.W $07F4 ; -2.121944E-4
DC.L $90BFBE8F
L0471A DC.W $0800 ; .6933594
DC.L $58C00000
L04720 DC.W $0801 ; 1.442695
DC.L $5C551D95
L04726 BSR.S L0472C
SUBQ.W #6,A1
BRA.S L04734
L0472C MOVE.W 0(A6,A1.L),D4
MOVE.L 2(A6,A1.L),D5
L04734 MOVE.W -(A4),D6
MOVE.L -(A4),2(A6,A1.L)
MOVE.W -(A4),0(A6,A1.L)
L0473E SUBQ.W #6,A1
MOVE.L D5,2(A6,A1.L)
MOVE.W D4,0(A6,A1.L)
JSR RI_MULT(PC) ;*/undomodify BSR RI_MULT
SUBQ.W #6,A1
MOVE.L -(A4),2(A6,A1.L)
MOVE.W -(A4),0(A6,A1.L)
JSR RI_ADD(PC) ;*/undomodify BSR RI_ADD
SUBQ.W #1,D6
BGT.S L0473E
RTS
L04760 SUBQ.W #6,A1
CLR.W 4(A6,A1.L)
MOVE.L #$08004000,0(A6,A1.L) ; 0.5
JSR RI_ADD(PC) ;*/undomodify BSR RI_ADD
L04772 MOVE.W 0(A6,A1.L),D0
MOVE.L 2(A6,A1.L),D1
ADDQ.W #2,A1
CLR.L 0(A6,A1.L)
SUBI.W #$0800,D0
BGE.S L04788
MOVEQ #0,D0
L04788 SUBI.W #$001F,D0
NEG.W D0
ASR.L D0,D1
MOVE.L D1,0(A6,A1.L)
RTS
RI_NINT:
BSR.S L04760
BRA.S L0479C
RI_INT:
BSR.S L04772
L0479C ADDQ.L #2,A1
CMPI.W #$0010,D0
BLT.S L047B4
BRA.S L047B0
RI_NLINT:
BSR.S L04760
BRA.S L047AC
L047AA:
BSR.S L04772
L047AC TST.W D0
BLT.S L047B4
L047B0 MOVEQ #0,D0
RTS
L047B4:
*/beginundoinsert
; BTST #1,$28002 ; overflow enable ?
; BNE.S L047B0 ; don't set flag
*/endundoinsert
MOVEQ #-18,D0 ; overflow error
RTS
RI_FLOAT:
MOVE.W #$081F,D0
MOVE.W 0(A6,A1.L),D1
ADDQ.W #2,A1
EXT.L D1
JMP L04830(PC) ;*/undomodify BRA.S L04830
;*/undomodify nop
L047C8:
SUBQ.W #6,A1
CLR.W 4(A6,A1.L)
MOVE.L #$08014000,0(A6,A1.L) ; 1.0
JSR RI_SWAP(PC) ;*/undomodify BSR RI_SWAP
RTS
L047DC MOVEM.L D4-D6,-(A7)
MOVE.W 0(A6,A1.L),D6
ADDQ.W #2,A1
BGE.S L047F2
NEG.W D6
BSR.S L047C8
JSR RI_DIV(PC) ;*/undomodify BSR RI_DIV
BNE.S L04824
L047F2 BSR.S L047C8
L047F4 LSR.W #1,D6
BCC.S L04810
MOVE.W 0(A6,A1.L),D5
MOVE.L $02(A6,A1.L),D4
JSR RI_MULT(PC) ;*/undomodify BSR RI_MULT
SUBQ.W #6,A1
BNE.S L04822
MOVE.L D4,2(A6,A1.L)
MOVE.W D5,0(A6,A1.L)
L04810 TST.W D6
BEQ.S L04820
JSR RI_DUP(PC) ;*/undomodify BSR RI_DUP
JSR RI_MULT(PC) ;*/undomodify BSR RI_MULT
BNE.S L04822
BRA.S L047F4
L04820 MOVEQ #0,D0
L04822 ADDQ.W #6,A1
L04824 MOVEM.L (A7)+,D4-D6
RTS
RI_SUB:
JSR RI_NEG(PC) ;*/undomodify BSR RI_NEG
BRA.S RI_ADD
L04830 SUBQ.W #6,A1
MOVEQ #0,D2
TST.L D1
BRA.S L04870
RI_ADD:
ADDQ.W #6,A1
MOVE.W 0(A6,A1.L),D0
SUB.W -6(A6,A1.L),D0
BGE.S L0485C
NEG.W D0
CMPI.W #$0020,D0
BGE.S L048AE
MOVE.L $02(A6,A1.L),D1
BSR.S L048C2
MOVE.W -6(A6,A1.L),D0
ADD.L -4(A6,A1.L),D1
BRA.S L04870
L0485C CMPI.W #$0020,D0
BGE.S L048BE
MOVE.L -4(A6,A1.L),D1
BSR.S L048C2
MOVE.W 0(A6,A1.L),D0
ADD.L 2(A6,A1.L),D1
L04870 BVS.S L04898
BEQ.S L048AA
MOVE.L D1,D3
ADD.L D3,D3
BVS.S L048B6
SUB.L D2,D3
BVC.S L04880
ADD.L D2,D3
L04880 SUBQ.W #1,D0
MOVE.L D3,D1
MOVEQ #$10,D2
L04886 MOVE.L D1,D3
ASL.L D2,D3
BVS.S L04892
MOVE.L D3,D1
SUB.W D2,D0
BLT.S L048A6
L04892 ASR.L #1,D2
BNE.S L04886
BRA.S L048B6
L04898 ROXR.L #1,D1
ADDQ.W #1,D0
BTST #12,D0
BEQ.S L048B6
MOVEQ #-$12,D0 ;*/undomodify BRA OV_RTS
RTS ;*/restorecode
L048A6 NEG.W D0
ASR.L D0,D1
L048AA CLR.W D0
BRA.S L048B6
L048AE MOVE.W -6(A6,A1.L),D0
MOVE.L -4(A6,A1.L),D1
L048B6 MOVE.L D1,2(A6,A1.L)
MOVE.W D0,0(A6,A1.L)
L048BE MOVEQ #0,D0
RTS
L048C2 MOVEQ #0,D2
TST.W D0
BEQ.S L048DC
ASR.L D0,D1
BCC.S L048DC
ADDQ.L #1,D1
MOVEQ #1,D2
SUBQ.W #1,D0
BGT.S L048DC
BCLR #0,D1
BEQ.S L048DC
MOVEQ #-1,D2
L048DC RTS
RI_MULT:
MOVEM.L D4-D6,-(A7)
SF D5
SF D6
MOVE.L 2(A6,A1.L),D3
BGE.S L048F4
JSR RI_NEG(PC) ;*/undomodify BSR RI_NEG
MOVE.L D1,D3
ST D6
L048F4 ADDQ.W #6,A1
MOVE.L 2(A6,A1.L),D1
BGT.S L04904
BEQ.S L0496A
JSR RI_NEG(PC) ;*/undomodify BSR RI_NEG
ST D5
L04904 LSL.L #1,D1
MOVE.L D1,D0
SWAP D0
LSL.L #1,D3
MOVE.L D3,D2
SWAP D2
MOVE.W D3,D4
MULU D1,D4
CLR.W D4
SWAP D4
MULU D0,D3
MULU D2,D1
ADD.L D4,D3
ADD.L D3,D1
MOVE.W D1,D4
CLR.W D1
SWAP D1
ROXR.W #1,D1
ROXL.L #1,D1
MULU D0,D2
MOVE.W 0(A6,A1.L),D0
ADD.W -6(A6,A1.L),D0
SUBI.W #$0800,D0
BLT.S L04956
ADD.L D2,D1
BMI.S L04948
BEQ.S L04956
SUBQ.W #1,D0
BLT.S L04956
ASL.W #1,D4
BRA.S L0494A
L04948 LSR.L #1,D1
L0494A MOVEQ #0,D4
ADDX.L D4,D1
BPL.S L0495A
LSR.L #1,D1
ADDQ.W #1,D0
BRA.S L0495A
L04956 CLR.W D0
CLR.L D1
L0495A MOVE.L D1,2(A6,A1.L)
MOVE.W D0,0(A6,A1.L)
CMP.B D5,D6
BEQ.S L0496A
JSR RI_NEG(PC) ;*/undomodify BSR RI_NEG
L0496A:
MOVEM.L (A7)+,D4-D6
BTST #4,0(A6,A1.L)
BNE.S L0497A ;*undomodify BNE.S OV_RTS
MOVEQ #0,D0
RTS
L0497A:
MOVEQ #-$12,D0 ;*/restorecode
RTS ;*/restorecode
L0497E:
RI_DIV:
MOVE.L D4,-(A7)
MOVE.L D5,-(A7)
SF D5 ; Signal +
MOVE.L 2(A6,A1.L),D2 ; mantissa 1
BGT.S L04994
BEQ.S RI_A1_OVerflow ; X/0
JSR RI_NEG(PC) ;*/undomodify BSR.S RI_NEG
;*/undomodify nop
MOVE.L D1,D2
ST D5 ; signal -
L04994:
ADDQ.W #6,A1
MOVE.L 2(A6,A1.L),D1 ; mantissa 2
BGT.S L049A4
BEQ.S L049F6 ; 0/x is simple
JSR RI_NEG(PC) ;*/undomodify BSR.S RI_NEG
;*/undomodify nop
NOT.B D5 ; signal +/- depending on
; first argument
L049A4 MOVE.W 0(A6,A1.L),D0 ; exponent 2
ADDI.W #$0800,D0
SUB.W -6(A6,A1.L),D0 ; eponent 1
BGE.S L049B8
CLR.W D0
CLR.L D3
BRA.S L049E6
L049B8 BTST #12,D0
BNE.S RI_OVERFlow ; overflow
MOVEQ #$1F,D4
MOVEQ #0,D3 ; D2 / D1 -> D3
L049C2 SUB.L D2,D1
BCS.S L049CA
BSET D4,D3
BRA.S L049CC
L049CA ADD.L D2,D1
L049CC ADD.L D1,D1
DBEQ D4,L049C2
TST.L D3
BLT.S L049DE
SUB.L D1,D2
BHI.S L049E6
ADDQ.L #1,D3
BVC.S L049E6
L049DE ADDQ.W #1,D0
LSR.L #1,D3
MOVEQ #0,D1
ADDX.L D1,D3
L049E6:
MOVE.L D3,2(A6,A1.L) ; Result mantissa
MOVE.W D0,0(A6,A1.L) ; exponent
TST.B D5
BEQ.S L049F6
JSR RI_NEG(PC) ;*/undomodify BSR.S RI_NEG
;*/undomodify nop
L049F6:
MOVEQ #0,D0
L049F8:
MOVE.L (A7)+,D5
MOVE.L (A7)+,D4
TST.L D0
RTS
L04A00:
RI_A1_OVerflow:
ADDQ.W #6,A1
RI_OVERFlow:
*/beginundoinsert
; MOVE.W #$0FEB,0(A6,A1.L) ; Make a big number
; MOVEQ #0,D0
; BTST #1,$28002 ; overflow enable ?
; BNE.S L049F8
*/endundoinsert
L04A02:
MOVEQ #-$12,D0 ; overflow error
BRA.S L049F8
L04A06:
RI_ABS:
TST.B 2(A6,A1.L)
BGE.S L04A46
L04A0C:
RI_NEG:
MOVE.L 2(A6,A1.L),D1
NEG.L D1
BVS.S L04A2C
CMPI.L #$C0000000,D1
BNE.S L04A42
LSL.L #1,D1
SUBQ.W #1,0(A6,A1.L)
BGE.S L04A42
ASR.L #1,D1
CLR.W 0(A6,A1.L)
BRA.S L04A42
L04A2C LSR.L #1,D1
ADDQ.W #1,0(A6,A1.L)
BTST #4,0(A6,A1.L)
BEQ.S L04A42
SUBQ.W #1,0(A6,A1.L)
MOVEQ #-1,D1
LSR.L #1,D1
L04A42 MOVE.L D1,2(A6,A1.L)
L04A46 MOVEQ #0,D0
RTS
RI_DUP:
SUBQ.W #6,A1
L04A4C:
MOVE.W 6(A6,A1.L),0(A6,A1.L)
MOVE.L 8(A6,A1.L),2(A6,A1.L)
MOVEQ #0,D0
RTS
L04A5C:
RI_SWAP:
MOVE.W 0(A6,A1.L),D2
MOVE.L 2(A6,A1.L),D1
JSR L04A4C(PC) ;*/undomodify BSR.S L04A4C
;*/undomodify nop
MOVE.W D2,6(A6,A1.L)
MOVE.L D1,8(A6,A1.L)
MOVEQ #0,D0
RTS
; --------------------------------------------------------------
;*/endfile